深入理解Java虚拟机(五): JDK内置监控神器
The following article is from 微技术栈 Author 李茹钰
点击上方"淼淼之森",选择"关注"公众号
优秀文章,第一时间收到!
Knowledge Sharing
知识分享
现在是资源共享的时代,同样也是知识分享的时代,如果你觉得本文有用,希望你能将它分享,让更多的人看到。
推荐阅读
1、神站推荐
2、资源汇总整理分享
JDK内置监控神器
1 eclipseMAT
MAT是一款快速,功能丰富的Java堆分析仪,可以帮助你查找内存泄漏和减少内存消耗。可以对象大小并且生成报告。
2 JProfiler
JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点,即:哪个对象占用的内存比较多;或者CPU热点,即:哪儿方法占用的较大得CPU资源。
3 jps
jps是jdk提供的一个查看当前Java进程的小工具。
# 命令格式:jps [options ] [ hostid ]
# [options]选项 :
# -q:仅输出VM标识符,不包括classname,jar name,arguments in main method
# -m:输出main method的参数
# -l:输出完全的包名,应用主类名,jar的完全路径名
# -v:输出jvm参数
# -V:输出通过flag文件传递到JVM中的参数(.hotspotrc文件或-XX:Flags=所指定的文件
# -Joption:传递参数到vm,例如:-J-Xms512m
# 只输出LVMID,省略主类的名称
jps -q
# 输出虚拟机进程启动时传递给主类main()函数的参数
jps -m
# 输出主类的全名,如果进程执行的是jar包,则输出jar包路径
jps -l
# 输出虚拟机进程启动时JVM参数
jps -v
4 jstack
jstack用于打印出给定的Java进程ID或core file或远程调试服务的Java堆栈信息。
jstack <pid>
5 jinfo
jinfo可以输出并修改运行时的java 进程的opts。用处比较简单,用于输出JAVA系统参数及命令行参数。
# 格式
jinfo -flags <pid>
# 查看进程2788的MaxPerm大小
jinfo -flag MaxPermSize 2788
6 jmap
打印出某个java进程(pid)内存内的所有‘对象’的情况(如:产生那些对象,及其数量)。
jmap -histo pid
jmap -histo pid>a.log
jmap -histo 9569 | head -10
# 使用eclipse打开看到jmap报告,使用eclipseMAT分析
jmap -dump:format=b,file=data.bin 3024
# 查看堆被谁占了
jmap -histo 9569 | head -10
7 jstat
jstat -gcutil -h10 9569 3s
8 jconsole
一个javaGUI监视工具,可以以图表化的形式显示各种数据,并可通过远程连接监视远程的服务器VM。用java写的GUI程序,用来监控VM,并可监控远程的VM,非常易用,而且功能非常强。命令行里打jconsole,选则进程就可以了。
9 jvisualvm
jvisualvm同jconsole都是一个基于图形化界面的、可以查看本地及远程的JAVA GUI监控工具,Jvisualvm同jconsole的使用方式一样,直接在命令行打入Jvisualvm即可启动,不过Jvisualvm相比,界面更美观一些,数据更实时。
10 jmc
11 jha/jdb
不常用
12 dmesg
用于排查:java进程自动消失
如果发现自己的java进程悄无声息的消失了,几乎没有留下任何线索,那么dmesg一发,很有可能有你想要的。
dmesg | grep -i 'pid'
sudo dmesg|grep -i kill|less
去找关键字oom_killer。找到的结果类似如下:
[0xd0, order=0, oom_adj=0, oom_scoe_adj=0
[ ] [<ffffffff81118898>] ? oom_kill_process+0x68/0x140
[ ] Task in /LXC011175068174 killed as a result of limit of /LXC011175068174
[ ] Memory cgroup out of memory: Kill process 215701 (java) score 854 or sacrifice child
[ ] Killed process 215701, UID 679, (java) total-vm:11017300kB, anon-rss:7152432kB, file-rss:1232kB
] java invoked oom-killer: gfp_mask=以上表明,对应的java进程被系统的OOM Killer给干掉了,得分为854。
解释一下OOM killer(Out-Of-Memory killer),该机制会监控机器的内存资源消耗。当机器内存耗尽前,该机制会扫描所有的进程(按照一定规则计算,内存占用,时间等),挑选出得分最高的进程,然后杀死,从而保护机器。剩下的,就是看看为什么内存这么大,触发了OOM-Killer了。
dmesg日志时间转换公式:log实际时间=格林威治1970-01-01+(当前时间秒数-系统启动至今的秒数+dmesg打印的log时间)秒数
date -d "1970-01-01 UTC `echo "$(date +%s)-$(cat /proc/uptime|cut -f 1 -d' ')+12288812.926194"|bc ` seconds"
-END-
关注公众号"淼淼之森";后台回复序号“4”获取超多精彩哦。